home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / sunprom / sun4.md / start.s < prev    next >
Text File  |  1989-12-20  |  3KB  |  111 lines

  1. !
  2. ! The following variable MUST be the first thing in this
  3. ! file, as its position marks the beginning of small data
  4. !
  5.     .seg    "data"
  6.     .global    _environ        ! first symbol in sdata        
  7. _environ:
  8.     .word    0
  9. !
  10. ! This variable is used in the DELAY macro.  5 is the right value for
  11. ! 68010's running 10MHz.  3 is the right value for 68020's running 16MHz
  12. ! with cache on.  (4x as fast at doing the delay loop.)  Other values
  13. ! should be empirically determined as needed.  Srt0.s sets this value
  14. ! based on the actual runtime environment encountered.
  15. !
  16. ! For a sunrise machine with no cache (16Mhz) the delay should be 4
  17. ! if the cache is on the delay can be 1
  18. !
  19. ! It's critical that the value be no SMALLER than required, e.g. the
  20. ! DELAY macro guarantees a MINIMUM delay, not a maximum.
  21. !
  22.     .seg    "data"
  23.     .global    _cpudelay
  24. _cpudelay:
  25.     .word    5            ! Multiplier for DELAY macro.
  26.  
  27.     .seg    "text"
  28.     .align    4
  29. !
  30. ! Startup code for standalone system
  31. !
  32. WINDOWSIZE = (16 * 4)
  33.  
  34.     .global    _end
  35.     .global    _edata
  36.     .global    _main
  37.     .global    __exit
  38.     .global    _Boot_Transfer
  39.     .global    start
  40. start:
  41.     save    %sp, -WINDOWSIZE, %sp    ! get a new window, leave room for args
  42.     call    1f            ! get the current pc into o7
  43.     nop                ! (where entry is currently located)
  44. 1:
  45.     mov    %o7, %o0        ! save for later
  46.     sub    %o0, 4, %o0        ! point to first byte of prog
  47.     set    start+4,%o6        ! address of call instruction - above 
  48.     cmp    %o6, %o7        ! are they the same
  49.     be    start
  50.     nop
  51.     set    _edata+4, %o2        ! end of program, inclusive, except bss
  52.     set     start, %o1        ! beginning of program
  53.     sub    %o2, %o1, %o2        ! size of program
  54.     !
  55.     ! check that the following copy won't write on itself
  56.     !
  57.     !add    %o7,%o2,%o5
  58.     !cmp    %o5,%o0    
  59.     !bg    cantreloc
  60.     !nop
  61.     !
  62.     ! copy program where it belongs
  63.     !
  64. 2:
  65.     ld    [%o0], %o3        ! read a word
  66.     add    %o0, 4, %o0            ! point to next src word
  67.     st    %o3, [%o1]        ! write a word
  68.     subcc    %o2,4, %o2        ! check if done
  69.     bge    2b            ! if not loop
  70.     add    %o1, 4, %o1        ! delay slot, point to next dest word
  71.     
  72.     set    go, %g1        ! now that it is relocated, jump to it
  73.     jmp    %g1
  74.     nop
  75.     ! program is now relocated
  76. go:
  77.     ! we should turn on cache at least by now
  78.     set    _end+4, %o2        ! end of bss
  79.     set    _edata, %o0        ! beginning of bss
  80.     sub    %o2, %o0, %o2        ! size of bss
  81.     ! zero the bss
  82. 1:
  83.     subcc    %o2,1,%o2            ! loop to zero bss
  84.     st    %g0, [%o0]
  85.     bnz    1b
  86.     add    %o0, 4, %o0
  87.  
  88.     ! general startup code
  89.     set    (_environ+0x1000), %g7    ! 1st global register (etext + 4K)
  90.     set    0x2000, %g6        ! 8k
  91.     add    %g7, %g6, %g6        ! 2nd global register (1st global + 8K)
  92.     ld    [%sp + WINDOWSIZE], %o0    ! argc
  93.     add    %sp, WINDOWSIZE + 4, %o1! argv
  94.     sll    %o0, 2, %o2        ! argc * sizeof (int)
  95.     add    %o2, 4, %o2        ! skip 0 at end of arg ptrs
  96.     add    %o1, %o2, %o2        ! environ ptr
  97.     call    _main
  98.     st    %o2, [%g7 + -0x1000]    ! store 1st word of sdata %ad(_environ)
  99.     nop
  100. #ifdef notdef
  101.     call    _exit            ! exit(0)
  102. #endif
  103.     mov    0, %o0            ! delay slot
  104. __exit:
  105.     ret                ! ret to prom
  106.     restore
  107.  
  108. _Boot_Transfer:
  109.     jmp    %o0
  110.     restore
  111.